home *** CD-ROM | disk | FTP | other *** search
/ CD ROM Paradise Collection 4 / CD ROM Paradise Collection 4 1995 Nov.iso / clang / ebksrc.zip / PICKFILE.CPP < prev    next >
C/C++ Source or Header  |  1991-08-07  |  5KB  |  247 lines

  1. /*
  2.  
  3.     pickfile.cpp
  4.     7-30-91
  5.     Directory PickList
  6.  
  7.     Copyright 1991
  8.     John W. Small
  9.     All rights reserved
  10.  
  11.     Licensed users of FlexList are free to use and
  12.     modify this tool for use in their programs.
  13.  
  14.  
  15.     PSW / Power SoftWare
  16.     P.O. Box 10072
  17.     McLean, Virginia 22102 8072 USA
  18.  
  19.     Voice: (703) 759-3838
  20.     CIS: 73757,2233
  21.  
  22. */
  23.  
  24.  
  25. #include <stdio.h>
  26. #include <ctype.h>
  27. #include <string.h>
  28. #include <io.h>
  29. #include <conio.h>
  30. #include <pckey.hpp>
  31. #include <pcled.hpp>
  32. #include <pcdir.hpp>
  33. #include <pickfile.hpp>
  34.  
  35. char PickFile::path[MAXPATH];
  36. char PickFile::auxpath[MAXPATH];
  37. char PickFile::drive[MAXDRIVE];
  38. char PickFile::dir[MAXDIR];
  39. char PickFile::file[MAXFILE];
  40. char PickFile::ext[MAXEXT];
  41.  
  42.  
  43. int PickFile::DEcompare(const DirE DE1, const DirE DE2)
  44. {
  45.     return strcmp(DE1->name,DE2->name);
  46. }
  47.  
  48. int PickFile::DEload(const char *pathname, int fattrib)
  49. {
  50.     struct ffblk dta;
  51.     char far *olddta;
  52.     int done, attrib, flags;
  53.     DirEntry de;
  54.     int MM, DD, YY, hh, mm;
  55.     char amPM;
  56.     struct text_info ti;
  57.  
  58.  
  59.     mattrib = fattrib;
  60.     if (strlen(strcpy(mask,fnexpand(pathname)))
  61.          == 3)  /* root directory */
  62.         strcat(mask,"*.*");
  63.     else if (!(fnsplit(mask,drive,dir,0,0) & WILDCARDS))
  64.         if ((attrib = _chmod(mask,0)) == -1)
  65.             return 0;
  66.         else if (attrib & FA_DIREC)
  67.                 strcat(mask,"\\*.*");
  68.     olddta = getdta();
  69.     done = findfirst(mask,&dta,fattrib);
  70.     while (!done)  {
  71.         de.tag = 0;
  72.         de.attrib = dta.ff_attrib;
  73.         (void) fattribStr(de.attribStr,de.attrib);
  74.         de.ftime  = dta.ff_ftime;
  75.         de.fdate  = dta.ff_fdate;
  76.         de.fsize  = dta.ff_fsize;
  77.         strcpy(de.name,dta.ff_name);
  78.  
  79.         DD = dta.ff_fdate & 0x001F;
  80.         MM = (dta.ff_fdate >> 5) & 0x000F;
  81.         YY = ((dta.ff_fdate >> 9) & 0x007F) + 80;
  82.         mm = ((dta.ff_ftime >> 5) & 0x003F) >> 1;
  83.         hh = (dta.ff_ftime >> 11) & 0x001F;
  84.         if (hh == 0)  {
  85.             hh = 12;
  86.             amPM = mm? 'a' : 'p';
  87.         }
  88.         else if (hh == 12)
  89.             amPM = mm? 'p' : 'a';
  90.         else if (hh > 12)  {
  91.             hh -= 12;
  92.             amPM = 'p';
  93.         }
  94.         else
  95.             amPM = 'a';
  96.         if (!strcmp(dta.ff_name,"."))  {
  97.             strcpy(file,".");
  98.             ext[0] = '\0';
  99.         }
  100.         else if (!strcmp(dta.ff_name,".."))  {
  101.             strcpy(file,"..");
  102.             ext[0] = '\0';
  103.         }
  104.         else
  105.             (void) fnsplit(dta.ff_name,drive,dir,file,ext);
  106.         de.fnameLen = strlen(file);
  107.         de.extLen = strlen(ext);
  108.         if (dta.ff_attrib == FA_DIREC)
  109.             sprintf(de.entry,"%-8s%c%-3s <DIR>    %2d-%02d-%2d  %2d:%02d%c ",
  110.                 file,de.extLen?'.':' ',(ext[0] == '.')?&ext[1]:ext,
  111.                 MM,DD,YY,hh,mm,amPM);
  112.         else
  113.             sprintf(de.entry,"%-8s%c%-3s %8ld %2d-%02d-%2d  %2d:%02d%c ",
  114.                 file,de.extLen?'.':' ',(ext[0] == '.')?&ext[1]:ext,
  115.                 dta.ff_fsize,MM,DD,YY,hh,mm,amPM);
  116.  
  117.         if (addD(&de))
  118.             done = findnext(&dta);
  119.         else
  120.             done = 1;
  121.     }
  122.     setdta(olddta);
  123.     if (!Nodes())
  124.         return 0;
  125.     return 1;
  126. }
  127.  
  128. char * PickFile::DEpathname(const DirE DE)
  129. {
  130.  
  131.     if (!DE)
  132.         return (char *)0;
  133.     strcpy(path,mask);
  134.     if (fnsplit(path,drive,dir,file,ext) & WILDCARDS)  {
  135.         fnmerge(path,drive,dir,(char *)0,(char *)0);
  136.         strcat(path,DE->name);
  137.     }
  138.     return path;
  139. }
  140.  
  141. char * PickFile::fattribStr(char *attribStr, char attrib)
  142. {
  143.  
  144.     if (!attribStr)
  145.         return (char *)0;
  146.     attribStr[0] = (attrib & FA_RDONLY)? 'R' : ' ';
  147.     attribStr[1] = (attrib & FA_HIDDEN)? 'H' : ' ';
  148.     attribStr[2] = (attrib & FA_SYSTEM)? 'S' : ' ';
  149.     attribStr[3] = (attrib & FA_LABEL)?  'L' : ' ';
  150.     attribStr[4] = (attrib & FA_DIREC)?  'D' : ' ';
  151.     attribStr[5] = (attrib & FA_ARCH)?   'A' : ' ';
  152.     attribStr[6] = '\0';
  153.     return attribStr;
  154. }
  155.  
  156. int PickFile::idle(int c)
  157. {
  158.     FlexList tmp(sizeof(DirEntry));
  159.     LineEditWindow LEW;
  160.  
  161.     if (c == -F3)  {
  162.         while (tmp.insQN(popN()));
  163.         strcpy(auxpath,mask);
  164.         do {
  165.             clear();
  166.             if (!LEW.edit(path,MAXPATH,MAXPATH/2,0,0,
  167.                 auxpath,PF_MASK))  {
  168.                 while(insQN(tmp.popN()));
  169.                 strcpy(mask,auxpath);
  170.                 return 1;
  171.                 // redisplay to clear edit window
  172.             }
  173.         } while (!DEload(path,mattrib));
  174.         putTitle(mask);
  175.         return 1;
  176.     }
  177.     return 0;
  178. }
  179.  
  180. #pragma argsused
  181. int PickFile::xcursor(void * D, const char * prefix, int pfLen)
  182. {
  183.     if (pfLen > ((DirE)D)->fnameLen)
  184.         return (9+pfLen-((DirE)D)->fnameLen);
  185.     return (pfLen+1);
  186. }
  187.  
  188.  
  189. int PickFile::doIt(void * D)
  190. {
  191.     int done;
  192.     FlexList tmp(sizeof(DirEntry));
  193.  
  194.     if (((DirE)D)->attrib & FA_DIREC)  {
  195.         if (!strcmp(((DirE)D)->name,"."))
  196.             return 1;
  197.         if (!stricmp(mask,DEpathname((DirE)D)))
  198.             return 1;  // same directory also
  199.         while (tmp.insQN(popN()));
  200.         if (DEload(DEpathname((DirE)D),mattrib))  {
  201.             putTitle(mask);
  202.             return -1;
  203.         }
  204.         clear();
  205.         while(insQN(tmp.popN()));
  206.         return 1;
  207.     }
  208.     return 0;
  209. }
  210.  
  211. unsigned PickFile::choose(const char *pathname, int fattrib,
  212.     const char *defaultExt)
  213. {
  214.     LineEditWindow LEW;
  215.     char auxext[MAXEXT];
  216.  
  217.     if (defaultExt)
  218.         if (strlen(defaultExt) < MAXEXT)
  219.             strcpy(auxext,defaultExt);
  220.         else
  221.             strcpy(auxext,".*");
  222.     else
  223.         strcpy(auxext,".*");
  224.     strcpy(auxpath,"*");
  225.     strcat(auxpath,auxext);
  226.     if (pathname)
  227.         strcpy(path,pathname);
  228.     else  {
  229.         if (!LEW.edit(path,MAXPATH,MAXPATH/2,0,0,
  230.             auxpath,PF_MASK))
  231.             return 0;
  232.     }
  233.     clear();
  234.     strcpy(path,fndefault(path,(char *)0,(char *)0,
  235.         (char *)0,auxext));
  236.     while (!DEload(path,fattrib))
  237.         if (!LEW.edit(path,MAXPATH,MAXPATH/2,0,0,
  238.             auxpath," File Mask Specification "))
  239.             return 0;
  240.         else
  241.             strcpy(path,fndefault(path,
  242.                 (char *)0,(char *)0,
  243.                 (char *)0,auxext));
  244.  
  245.     return PickListWindow::choose();
  246. }
  247.